home *** CD-ROM | disk | FTP | other *** search
/ The Arsenal Files 4 / The Arsenal Files 4 (Arsenal Computer).ISO / gen_prog / inst103.exe / INSTALL.DOC < prev    next >
Text File  |  1995-01-03  |  39KB  |  1,562 lines

  1. ┌──── ┌───  ┌──  ┌────── ┌──────── ┌──────  ┌──     ┌──     ┌────── ┌───────
  2.  ┌──  ┌──┌─ ┌── ┌──         ┌──   ┌──   ┌── ┌──     ┌──     ┌──     ┌──   ┌──
  3.  ┌──  ┌── ┌─┌──  ┌──────    ┌──   ┌──────── ┌──     ┌──     ┌────   ┌───────
  4.  ┌──  ┌──  ┌───       ┌──   ┌──   ┌──   ┌── ┌──     ┌──     ┌──     ┌──   ┌──
  5. ┌──── ┌──   ┌──  ┌──────    ┌──   ┌──   ┌── ┌────── ┌────── ┌────── ┌──   ┌──
  6.  
  7. ──────────────────────────────────────────────────────────────────────
  8.  Installer! v1.03
  9.  (c) Copyright 1994 by Matthew Mastracci
  10.  Every single last (all) right(s) reserved
  11. ──────────────────────────────────────────────────────────────────────
  12.  
  13.  in'stall - to set in position for use
  14.  
  15.  
  16. ──────────────
  17.  Table of contents
  18. ──────────────
  19.  
  20.  Topics are just as they appear here in the contents, so you can use a
  21.  search with greater ease.
  22.  
  23. 0.0 Just a few legal issues
  24.  
  25. 1.0 Introduction
  26.  1.1 NB!
  27.  1.2 Revisions
  28.  
  29. 2.0 Usage (from writing to compiling)
  30.  2.1 Deciding on features
  31.  2.2 Editing the script
  32.  2.3 Running the script
  33.  2.4 CHECKing the script
  34.  2.5 COMPILEing the script
  35.  2.6 Command-line usage
  36.  
  37. 3.0 Script-land
  38.  3.1 Constants
  39.  3.2 Variables
  40.  3.3 Commands
  41.  3.4 Labels
  42.  3.5 Put it all together...
  43.  3.6 ...and whatd'ya got?
  44.   
  45. 4.0 Special Variables
  46.  
  47. 5.0 Command Reference
  48.  
  49. 6.0 Error Codes
  50.  
  51. 7.0 CHECK: Script Syntax Checker
  52.  7.1 Errors and warnings for CHECK and COMPILE
  53.   
  54. 8.0 COMPILE: Script Compiler
  55.  
  56. 9.0 Demos
  57.  
  58. 10.0 Keeping in touch
  59.  
  60. ──────────────
  61.  0.0 Just a few legal issues
  62. ──────────────
  63.  
  64.      To start out, I'd like to say that I'm going to have as *few* legalities
  65. for this program as possible (ha!).  The best way to put them would be in a
  66. list, so here goes:
  67.  
  68. 1.  This (the unregistered version of Installer!) may be used in any freeware
  69.     or shareware demo program without permission.  It may not be used in a
  70.     commercial product, as per point 2.
  71.  
  72. 2.  If the program is going to be used in a commercial package, contact with
  73.     the author is necessary first.  A small fee (small!) will be charged, in
  74.     which you recieve a license to use the program in a commercial environment,
  75.     and also a version which has a customized title screen.
  76.  
  77. 3.  Anyone can purchase a license and a blank title screen version by
  78.     contacting the author.  This version can still only by used in a
  79.     shareware environment, but looks much nicer.
  80.  
  81. 4.  Any damages caused by this program are purely coincidential.  I am not
  82.     responsable for anything which happens to your or anyone else's computer
  83.     while using this program.  Please don't take this as an expectation of
  84.     something going wrong, just a warning that if something does, it's not
  85.     my fault.
  86.  
  87. 5.  This isn't really a legality, but I'd just like to ask you to put a little
  88.     word or two in your docs, just so I can see where this program gets to...
  89.  
  90. ;)
  91.  
  92. ──────────────
  93.  1.0 Introduction
  94. ──────────────
  95.  
  96.      The one thing that nearly all shareware and commercial packages have is
  97. an install program.  Quality of these installation programs can vary from
  98. absolute crap to a stunningly beautiful piece of art.  Sadly, this facet of
  99. program development is sometimes neglected.  Hurried authors compose quick-
  100. and-dirty batch files to copy the files and maybe a small CON I/O install
  101. program to set up one or two options.  This is why the need for a programming
  102. script based installation program is so great.  With one, you could create a
  103. fully functional script to copy files, set up configurations and still have
  104. colorful, user-friendly interfaces.  That's the reason for Installer.
  105.  
  106.  1.1 NB!
  107. Here's a message that came through comp.lang.pascal on November 26th, 1994,
  108. two days after I did the manual:
  109.  
  110. ├──── 8< ──────────
  111.  
  112.   PROBLEM WITH UNAUTHORIZED WINDOWS 95 DISK SETUP
  113.   -----------------------------------------------
  114.  
  115. If you have the disk that accompanies my new book, "Unauthorized Windows 95," a
  116. word of warning before you try to install the disk:  the lame batch file setup
  117. (I had all of six hours to put the disk together, so there's not even a proper
  118. Windows setup) has a really stupid bug:
  119.  
  120.   set uwdest=C:\UNAUTHW
  121.   ...
  122.   set uwdest=%1
  123.   ...
  124.   md %uwdest%
  125.   cd %uwdest%
  126.   ...
  127.  
  128. Wishful thinking on my part that the CD command would switch drives as well as
  129. directories!  If you run this from any drive other than the destination drive,
  130. the CD command will fail.  And if run directly from the floppy drive (for
  131. example, by clicking on SETUP.BAT in File Manager or in the Win95 Explorer),
  132. the results are disasterous, because of the following commands later on in the
  133. setup:
  134.  
  135.   del include.zip
  136.   del source.zip
  137.   del lib.zip
  138.   ...
  139.  
  140. This ends up deleting the .zip files from the original floppy! (Unfortunately,
  141. the manufacturer did not send the disk out write-disabled.)
  142.  
  143. The solution is to run the setup file from the same drive on which you wish to
  144. install the Unauthorized software.
  145.  
  146.  Sorry,
  147.  Andrew
  148.  
  149. ├───── >8 ─────────
  150.  
  151.  1.2 Revisions
  152.  
  153.   1.0  - First beta release
  154.    .01 - Added STOP command
  155.        - Realized that FOPEN, FWRITE, FREAD and FCLOSE weren't in the manual
  156.        - Wrote the CHECK program for debugging scripts
  157.    .02 - Wrote the COMPILE program for converting scripts into an unreadable
  158.          binary form
  159.    .03 - Updated INSTALL.DOC with some help on the script-writing process
  160.        - Added the GOSUB, RETURN and COUNT commands
  161.        - Revised COPY.CFG to give a little help with GOSUB.
  162.        - Added the PCTBAR.CFG demo, and then converted it into a built-in
  163.          function.
  164.        - Fixed a stupid CLREOL bug.
  165.        - And (ba-da-bing) first non-beta release!
  166.  
  167. ──────────────
  168.  2.0 Usage (from writing to compiling)
  169. ──────────────
  170.  
  171.      Installer! is an easy program to use in the development of custom 
  172. installation scripts.  There are five basic steps to creating and shipping
  173. an Installer! script with your program:
  174.  
  175. 1.  Decide which features you want in your program
  176.  
  177. 2.  Using EDIT or another ASCII word-processor, edit your script (taking bits 
  178.     from the demos, if necessary)
  179.  
  180. 3.  Run the program and check for flaws, if there are problems, redo step 2
  181.  
  182. 4.  Run CHECK on the program to look for any typos or mistakes, if there are
  183.     errors or warnings, redo step 2
  184.  
  185. 5.  Run COMPILE on the program and rename the compiled data file as 
  186.     INSTALL.DAT, so it will be run automatically when the user types INSTALL
  187.  
  188.  2.1 Deciding on features
  189.  
  190.      Before you create your installation script, you must decide first what
  191. you want in it.  These bits can range from automatic copying to sound source
  192. selection.  From this, you can decide which demos to cannibolize, which to
  193. rewrite to suit your taste and which to write from scratch.  The demos are
  194. explained in a little more depth in 9.0.
  195.  
  196.  2.2 Editing the script
  197.  
  198.      Once you've obtained your ideal form for an installation program, you can
  199. now start to write it.  The best way is to load up EDIT and begin from the
  200. basics, saving and running each time you finish or debug a section.  
  201.  
  202.  2.3 Running the script
  203.  
  204.      To run a script (either binary or text), just place the name of the file
  205. you wish to run as the first parameter of INSTALL.EXE.  The script-name 
  206. defaults to INSTALL.DAT and then INSTALL.CFG if it doesn't exist, so you can
  207. automatically a script named INSTALL.CFG (if there is no INSTALL.DAT).
  208.  
  209.  2.4 CHECKing the script
  210.  
  211.      Once you've run all the bugs out of the program, you can run the CHECK
  212. program on it.  The CHECK program will scan through the lines of the program,
  213. making sure all of the GOTOs have matching labels, the quotation marks are
  214. matched up, etc.  To run it, just type CHECK and then the text script-name
  215. as the first parameter.  The errors for this program are explained in-depth 
  216. in section 6.0.
  217.  
  218.  2.5 COMPILEing the script
  219.   
  220.      Now that all the grammatical errors are out of the script, you want to
  221. compile it into an unreadable binary form.  To do this, just run the COMPILE
  222. program with the text script-name as the first parameter and make sure there
  223. are no errors.  Once this is done, rename the compiled .DAT file as 
  224. INSTALL.DAT, so the user can run INSTALL.EXE and have the script run.  For
  225. more information, see section 8.0.
  226.  
  227.  2.6 Command-line usage
  228.  
  229. Usage: install [scriptname .cfg | .dat]
  230.  
  231.      "scriptname" can be a .cfg or .dat file.  If none is specified, it 
  232. reads install.dat (or install.cfg if it doesn't exist).
  233.  
  234. ──────────────
  235.  3.0 Script-land
  236. ──────────────
  237.  
  238.  3.1 Symbols
  239.      The script language for Installer is created for its absolute ease of
  240. use.  Cryptic symbols and punctuational vertigo have been done away with and
  241. replaced with easy to use commands with easy to remember syntaxes.  Variables
  242. have been encompassed down into two simple types: integer and string.  Integer
  243. variables contain numbers that can range from -2,147,483,648 to 2,147,483,647,
  244. which just so happens to be the amount that a 32-bit variable can hold.  Text
  245. is held in variables called Strings, which are basically strings of letters
  246. that can anywhere be from 0 to 255 characters long.  Variables are identified
  247. by two symbols (two of the only three in the script language), the pound sign,
  248. representing integers (#) and the dollar sign, representing strings ($).  Here
  249. is a simple little demo of variables:
  250.  
  251.   #cows    - Integer variable
  252.   $hisname - String variable
  253.   #hisage  - Integer variable
  254.   $address - String variable
  255.  
  256.  3.2 Variables
  257.      The adjective "variable" describes something which can change.  Not all
  258. things _can_ change however.  Take the number 3 for example.  If you change
  259. it to a 4, it's no longer a 3.  That's why constants are required.  To be
  260. constant means to stay the same (like 3).  Integer constants are easy: all
  261. they consist of is a number, maybe with a negative sign in front.  String
  262. constants are a little tougher: they are text encompassed by the quote (")
  263. characters.  Here are a few examples of constants:
  264.  
  265.    123        - Integer constant
  266.    "123"      - String constant
  267.    -2000000   - Integer constant
  268.    "Catch-22" - String constant
  269.  
  270.    NB: if you're wondering how to put a quote (") inside a string constant,
  271.        read the reference on the string variable $quote...
  272.  
  273.  3.3 Commands
  274.      Using a mix of variables and constants, the program can be instructed to
  275. do a multitude of activities by giving it commands.  To command something is
  276. to tell it what to do (or else), which quite aptly describes the use of the
  277. commands in the script language.  A command is comprised to two simple parts:
  278. the name and the parameters (sometimes referred to as arguments, but that
  279. doesn't go over well with most people).  The name of the command is analogous
  280. to a telephone number.  You can't exactly expect a positive result from Bob if you
  281. call up the local Pizza Hut and say "file the '94 budget!"  (in most cases Bob
  282. doesn't even know he has to do anything).  The parameters of the command are
  283. also quite ingeniously named.  If you give someone orders which contain some
  284. "mission parameters," you are telling them what they can or cannot do.  Ditto
  285. for a command's parameters (quite ditto, to say the least).  To preserve the
  286. element of balance in this document, here are some command/parameter examples:
  287.  
  288.      clrscr
  289.        ^ C
  290.      write "His name is " $name " and he lives at " #housenum $address
  291.        ^ C        ^ SC      ^ SV        ^ SC            ^ IV      ^ SV
  292.      comma 153464 $bignum
  293.        ^ C    ^ IC   ^ SV
  294.  
  295.    NB: String and Integer variables and constants are abbreviated to SV, SC,
  296.        IV and IC; while commands are abbreviated to C.  Sorry for the
  297.        cryptics, but I ran out of room...   <grin>
  298.  
  299.  
  300.  3.4 Labels
  301.      To create even a partially structured language, labels are required.  In
  302. Installer!, the way to define a label is to precede it with a colon (:).  When
  303. referring to the label in a goto or if statement, don't use a colon.  Here's
  304. a little example:
  305.  
  306. writeln "Here! (1)"
  307. goto Past
  308. writeln "Shouldn't be here! (2)"
  309. ; never gets seen
  310. :Past
  311. writeln "Here! (3)"
  312.  
  313.  3.5 Put it all together...
  314.      Probably the most used command of all is the "put" command.  It transfers
  315. the value of a string of integer variable or constant into a string or integer
  316. variable, converting between the two if necessary.  It looks something like
  317. this:
  318.  
  319.      Command                            Variable Values
  320.  
  321.      put $salestext into #sales         $salestext = "-100"  #sales = -100
  322.       ^ C    ^ SV           ^ IV
  323.      put 4 into $four                   $four = "4"
  324.       ^C ^IC      ^ SV
  325.  
  326.    NB: the "into" part of the command is mainly for flow, and is not required
  327.        to be the word "into."  It could be "spam" for all the program cares...
  328.  
  329.  3.6 ...and whatd'ya got?
  330.      Now that we have a good grasp of the language, let's put together a tiny
  331. script to get used to the language:
  332.  
  333. -- 8< -- cut
  334. ; Tiny little script demo
  335.  
  336. write "Enter a number: "
  337. ; Writes the string "Enter a number: " to the screen, leaving the cursor at
  338. ; the end
  339. read #n
  340. ; Reads a string from the user, converts it to an integer and stores it in the
  341. ; integer variable "#n"
  342. mul #n 5
  343. ; Multiples the value in #n by 5 and then puts the new value back
  344. writeln "Your number multiplied by 5 is " #n
  345. ; Tells the user what their number is when it's multiplied by 5
  346. -- 8< -- cut
  347.  
  348.    NB(s): The lines that start with a semicolon (;) are comments.  To run this
  349.           script, cut between the little cut marks and paste (editor, not
  350.           Elmer's) it into a file named INSTALL.CFG.  To run it, just type
  351.           "INSTALL" at the DOS prompt and Installer will run it for you.
  352.  
  353.  
  354.  
  355. ──────────────
  356.  4.0 Special Variables
  357. ──────────────
  358.  
  359.      These variables have special meaning in the program.  They can be
  360. accessed and modified like regular variables, but contain information that
  361. controls the flow of the program:
  362.  
  363. ──────────────
  364.  #FATTR
  365. ──────────────
  366.  
  367.      Holds the file attribute from the file found using the last "findnext"
  368. command.  The bits of the value are used as follows:
  369.  
  370.  7 6 5 4 3 2 1 0  (2 ^ x or 1 shl x)
  371.  o o o o o o o o
  372.  │ │ │ │ │ │ │ Read Only
  373.  │ │ │ │ │ │ Hidden
  374.  │ │ │ │ │ System
  375.  │ │ │ │ Volume Label
  376.  │ │ │ Directory
  377.  │ │ Archive
  378.  │ Unused
  379.  Unused
  380.  
  381. Example:
  382.  
  383. ; print directory name
  384. put "." into $curdir
  385. fexpand $curdir
  386. writeln "Directory of " $curdir
  387. writeln
  388. find "*.*" 63
  389. ; find all files
  390. :Read
  391. findnext
  392. ; load $fname and #fattr
  393. write $fname " "
  394. gotoxy 15 #wherey
  395. put #fattr into #attr
  396. and #attr 1
  397. ; test for read only attribute
  398. if #attr = 0 then Hidden
  399. write "R/O "
  400. :Hidden
  401. put #fattr into #attr
  402. and #attr 2
  403. ; test for hidden attribute
  404. if #attr = 0 then System
  405. write "Hid "
  406. :System
  407. put #fattr into #attr
  408. and #attr 4
  409. if #attr = 0 then Archive
  410. ; test for system attribute
  411. write "Sys "
  412. :Archive
  413. put #fattr into #attr
  414. and #attr 32
  415. if #attr = 0 then Next
  416. ; test for archive attribute
  417. write "Arc "
  418. :Next
  419. writeln
  420. if #filesleft = 1 then Read
  421.  
  422. ──────────────
  423.  #FILESLEFT
  424. ──────────────
  425.  
  426.      Reports 1 if there are any more files to be retrieved with findnext or
  427. else 0 if there aren't.
  428.  
  429. find "\autoexec.bat" 63
  430. findnext
  431. if #filesleft = 1 then Fine
  432. writeln "AUTOEXEC.BAT not found!"
  433. :Fine
  434.  
  435. ──────────────
  436.  $FNAME
  437. ──────────────
  438.  
  439.      Holds the filename from the last findnext command.
  440.  
  441. find "\*.bat" 63
  442. findnext
  443. writeln "First batch file in root directory is " $fname
  444.  
  445. ──────────────
  446.  #FSIZE
  447. ──────────────
  448.  
  449.      Holds the size for the last file found using the findnext command and
  450. the total size of all files found with the count command.
  451.  
  452. Example:
  453.  
  454. find "*.*" 32
  455. ; find all archive files
  456. :Read
  457. findnext
  458. add #total #fsize
  459. if #filesleft = 1 then Read
  460. comma #total $total
  461. writeln "Total: " $total " bytes"
  462.  
  463. (see COPY.CFG for an example using count)
  464.  
  465. ──────────────
  466.  #LASTRESULT
  467. ──────────────
  468.  
  469.      Holds the last result of an arithmatic command.  The arithmatic commands
  470. are: add, and, dec, div, inc, mod, mul, or, sub and xor.
  471.  
  472. Example:
  473.  
  474. put 15 into #sales
  475. add #sales 25
  476. ; 40
  477. put 32 into #sales
  478. writeln "#sales was " #lastresult " before and " #sales " now."
  479.  
  480. ──────────────
  481.  #PERCENT
  482. ──────────────
  483.  
  484.      Holds the percentage calculated by a pctbar statement.
  485.  
  486. (see COPY.CFG for an example)
  487.  
  488. ──────────────
  489.  #TEXTCOLOR
  490. ──────────────
  491.  
  492.      Holds the color used for writing text on the screen with writeln, write
  493. and all other string-writing commands.  The bit layout for this is:
  494.  
  495.  7 6 5 4 3 2 1 0  (2 ^ x or 1 shl x)
  496.  o o o o o o o o
  497.  │ │ │ │ │ │ │ │
  498.  │ │ │ │ Foreground color
  499.  │ Background color
  500.  Blink
  501.  
  502.  Color = fore + (back * 16) + (blink * 128)
  503.  
  504. Example:
  505.  
  506. ; clear screen to bright write on blue
  507. put 31 into #textcolor
  508. clrscr
  509. ; write text in yellow and red
  510. put 78 into #textcolor
  511. clreol
  512. center 1 "Yellow on red!"
  513.  
  514. ──────────────
  515.  $QUOTE
  516. ──────────────
  517.  
  518.      Holds the quote character (").
  519.  
  520. Example:
  521.  
  522. writeln "He said, " $quote "Hi there!" $quote
  523.  
  524. ──────────────
  525.  #READUPDOWN
  526. ──────────────
  527.  
  528.      Instructs the readfield command, if there is a number present in the
  529. entry area, to increment or decrement it by one when the user presses the up
  530. or down keys.
  531.  
  532. Example:
  533.  
  534. put 10 into $s
  535. put 1 into #readupdown
  536. writeln "Use the up and down arrow keys to adjust the number."
  537. readfield 1 2 10 $s
  538.  
  539. ──────────────
  540.  #WHEREX
  541. ──────────────
  542.  
  543.      Holds the current cursor X position on the screen.
  544.  
  545. Example:
  546.  
  547. random 60 #x
  548. random 24 #y
  549. gotoxy #x #y
  550. put #wherex into #l1
  551. put #wherey into #l2
  552. writeln "(" #l1 ", " #l2 ")"
  553.  
  554. ──────────────
  555.  #WHEREY
  556. ──────────────
  557.  
  558.      Holds the current cursor Y position on the screen.
  559.  
  560. find "*.*" 63
  561. findnext
  562. write $fname
  563. gotoxy 15 #wherey
  564. write #fsize
  565.  
  566. ──────────────
  567.  5.0 Command Reference
  568. ──────────────
  569.  
  570.      The parameters for the commands are designated as follows:
  571.  
  572.      #var           - Integer variable
  573.      $var           - String variable
  574.      [#var]         - Variable is optional
  575.      #var1 | #var2  - Either variable may be used
  576.  
  577. ──────────────
  578.  ADD
  579. ──────────────
  580.  
  581. Syntax: add #var #val
  582.  
  583.      Adds "#val" to the current value of "#var", placing the result in "#var".
  584.  
  585. Example:
  586.  
  587. put 10 into #n
  588. add #n 20
  589. writeln "10 + 20 = " #n
  590.  
  591. ──────────────
  592.  AND
  593. ──────────────
  594.  
  595. Syntax: and #var #val
  596.  
  597.      Binary ands the value of "#var" with "#val", placing the result in "#var".
  598.  
  599. 1 and 1 = 1
  600. 1 and 0 = 0
  601. 0 and 1 = 0
  602. 0 and 0 = 0
  603.  
  604. (see #fattr for example)
  605.  
  606. ──────────────
  607.  BUILD
  608. ──────────────
  609.  
  610. Syntax: build
  611.  
  612.      Copies the current screen to a temporary page and changes the display
  613. page to view that page.  All screen writes take place on the hidden page while
  614. in this mode.  Use show to restore the changes.
  615.  
  616. Example:
  617.  
  618. build
  619. rwrite 40 "│  │  "
  620. show
  621.  
  622. ──────────────
  623.  CENTER
  624. ──────────────
  625.    
  626. Syntax: center #y $text
  627.  
  628.      Centers the text "$text" on row "#y".
  629.  
  630. (see #textcolor for example)
  631.  
  632. ──────────────
  633.  CHDIR
  634. ──────────────
  635.  
  636. Syntax: chdir $dir
  637.  
  638.      Changes the current drive and directory to "$dir".
  639.  
  640. Example:
  641.  
  642. write "Which directory to change to? "
  643. read $s
  644. chdir $s
  645.  
  646. ──────────────
  647.  CLOSEWIN
  648. ──────────────
  649.  
  650. Syntax: closewin
  651.  
  652.      Closes the last opened window on the screen.
  653.  
  654. window 3 3 20 20 79 79 79 "Window!" 1
  655. wait 2
  656. closewin
  657.  
  658. ──────────────
  659.  CLREOL
  660. ──────────────
  661.  
  662. Syntax: clreol
  663.  
  664.      Clears to the end of the current line, using the color in textcolor.
  665.  
  666. (see #textcolor for example)
  667.  
  668. ──────────────
  669.  CLRSCR
  670. ──────────────
  671.  
  672. Syntax: clrscr
  673.  
  674.      Clears the screen or text window to the color in textcolor.
  675.  
  676. (see #textcolor for example)
  677.  
  678. ──────────────
  679.  COMMA
  680. ──────────────
  681.  
  682. Syntax: comma #num $comma'd
  683.  
  684.      Adds commas to the value in "#num", storing the result as a string in
  685. "$comma'd"
  686.  
  687. (see #fsize for example)
  688.  
  689. ──────────────
  690.  COUNT
  691. ──────────────
  692.  
  693. Syntax: count $filespec #attr #total
  694.  
  695.      Counts the number of files matching "$filespec" and "#attr" and stores 
  696. the total number in "#total".  Stores the total size in "#fsize".  This 
  697. should not be used concurrently with find and findnext.
  698.  
  699. (see COPY.CFG for example)
  700.  
  701. ──────────────
  702.  DEC
  703. ──────────────
  704.  
  705. Syntax: dec #var
  706.  
  707.      Decrements "#var" by 1.
  708.  
  709. Example:
  710.  
  711. put 78 into #n
  712. dec #n
  713. writeln "78 - 1 = " #n
  714.  
  715. ──────────────
  716.  DISKFREE
  717. ──────────────
  718.  
  719. Syntax: diskfree $drive #free
  720.  
  721.      Stores the amount of space free on "$drive" in "#free".  To get the free
  722. space on the current drive, use "" for "$drive".
  723.  
  724. Example:
  725.  
  726. diskfree "" #n
  727. div #n 1024
  728. comma #n $free
  729. writeln $free " bytes free on current drive"
  730.  
  731. ──────────────
  732.  DIV
  733. ──────────────
  734.  
  735. Syntax: div #var #val
  736.  
  737.      Divides #var by #val, storing the result in #var.
  738.  
  739. (see diskfree for example)
  740.  
  741. ──────────────
  742.  FCOPY
  743. ──────────────
  744.  
  745. Syntax: fcopy $source $dest
  746.  
  747.      Copies the file from "$source" to "$dest".
  748.  
  749. Example:
  750.  
  751. fcopy "\autoexec.bat" "\autoexec.bak"
  752.  
  753. ──────────────
  754.  FEXPAND
  755. ──────────────
  756.  
  757. Syntax: fexpand $filename
  758.  
  759.      Expands "$filename" into a fully qualified pathname, including drive,
  760. directory and file (if any).
  761.  
  762. put "." into $curdir
  763. fexpand $curdir
  764. writeln "Current directory is " $curdir
  765.  
  766. ──────────────
  767.  FIND
  768. ──────────────
  769.  
  770. Syntax: find $filespec #attr
  771.  
  772.      Sets up the parameters for the findnext command.  The findnext command
  773. returns a list of files (one by one) that match the wildcards in "$filespec"
  774. and only have attributes that are specified in "#attr".
  775.  
  776.  7 6 5 4 3 2 1 0  (2 ^ x or 1 shl x)
  777.  o o o o o o o o
  778.  │ │ │ │ │ │ │ Read Only
  779.  │ │ │ │ │ │ Hidden
  780.  │ │ │ │ │ System
  781.  │ │ │ │ Volume Label
  782.  │ │ │ Directory
  783.  │ │ Archive
  784.  │ Unused
  785.  Unused
  786.  
  787.  With this list of files, only the ones marked with a * will be returned with
  788.  the command: find "*.sys" 35
  789.  
  790.   AUTOEXEC.BAT Arc R/O          <- doesn't match wildcard
  791.  *CONFIG.SYS   Arc R/O          <- matches
  792.   IO.SYS       Arc R/O Hid Sys  <- has sys attribute, not specified
  793.   MSDOS.SYS    Arc R/O Hid Sys  <- has sys attribute, not specified
  794.   IMAGE.IDX    Arc R/O Hid      <- doesn't match wildvard
  795.  
  796. (see #fattr for example)
  797.  
  798. ──────────────
  799.  FCLOSE
  800. ──────────────
  801.  
  802. Syntax: fclose
  803.  
  804.      This closes the file opened with "fopen".
  805.  
  806. Example:
  807.  
  808. fopen "test.$$$" 1
  809. fwrite "Hi!"
  810. fwrite "12"
  811. fclose
  812. fopen "test.$$$" 0
  813. fread $s
  814. writeln $s
  815. fread #i
  816. writeln #i
  817.  
  818. ──────────────
  819.  FOPEN
  820. ──────────────
  821.  
  822. Syntax: fopen $filename #mode
  823.  
  824.      Opens the file "$filename" in write (#mode = 1) or read (#mode = 0).
  825.  
  826. (see fclose for example)
  827.  
  828. ──────────────
  829.  FREAD
  830. ──────────────
  831.  
  832. Syntax: fread var
  833.  
  834.      Reads a line of text from the file opened with fopen.
  835.  
  836. (see fclose for example)
  837.  
  838. ──────────────
  839.  FWRITE
  840. ──────────────
  841.  
  842. Syntax: fwrite [var1 ... [var]]
  843.  
  844.      Writes the list of variables to the file opened with fopen.
  845.  
  846. (see fclose for example)
  847.  
  848. ──────────────
  849.  GOSUB
  850. ──────────────
  851.  
  852. Syntax: gosub label
  853.  
  854.      Transfers execution of the program to the line labelled with "label" and
  855. pushes the current line onto the gosub stack.  Use RETURN to pop the
  856. linenumber off the stack.
  857.  
  858.  
  859. Example:
  860.  
  861. put 1 into #x
  862. gosub Mul5
  863. put 2 into #x
  864. gosub Mul5
  865. stop
  866.  
  867. :Mul5
  868. mul #x 5
  869. writeln #x
  870. return
  871.  
  872. ──────────────
  873.  GOTO
  874. ──────────────
  875.  
  876. Syntax: goto label
  877.  
  878.      Transfers execution of the program to the line labelled with "label".
  879.  
  880. (see #fattr for example)
  881.  
  882. ──────────────
  883.  GOTOXY
  884. ──────────────
  885.  
  886. Syntax: gotoxy #x #y
  887.  
  888.      Moves the cursor to (#x, #y).
  889.  
  890. (see #wherex for example)
  891.  
  892. ──────────────
  893.  IF ... THEN
  894. ──────────────
  895.  
  896. Syntax: if condition then label
  897.  
  898.      If condition is true, then execution is transferred to the line labelled
  899. "label".  These are the possible conditions:
  900.  
  901. var1 = var2   the two variables are equal
  902. var1 > var2   var1 is greater than var2
  903. var1 < var2   var1 is less than var2
  904. var1 <> var2  var1 is not equal to var2
  905.  
  906. NB: If var1 and var2 are not the same type then var2 is converted to var1's
  907.     type.
  908.  
  909. (see #fattr for example)
  910.  
  911. ──────────────
  912.  INC
  913. ──────────────
  914.  
  915. Syntax: inc #var
  916.  
  917.      Incrememnts the value of "#var" by one.
  918.  
  919. Example:
  920.  
  921. find "*.*" 63
  922. :Read
  923. findnext
  924. inc #fn
  925. writeln "#" #fn " " $fname
  926. if #filesleft = 1 then Read
  927.  
  928. ──────────────
  929.  LENGTH
  930. ──────────────
  931.  
  932. Syntax: length $str #len
  933.  
  934.      Stores the length of string "$str" in "#len"
  935.  
  936. Example:
  937.  
  938. length "123456789" #n
  939. writeln "Length is " #n
  940.  
  941. ──────────────
  942.  MKDIR
  943. ──────────────
  944.  
  945. Syntax: mkdir $dir
  946.  
  947.      Creates the directory "$dir".  If there is more than one directory to
  948. create, it will create them all one by one.
  949.  
  950. Example:
  951.  
  952. write "Make what directory? "
  953. read $s
  954. mkdir $s
  955.  
  956. ──────────────
  957.  MOD
  958. ──────────────
  959.  
  960. Syntax: mod #var #val
  961.  
  962.      Performs modulos arithmatic on "#var" and "#val" and stores the result in
  963. "#var".  The modulos of two numbers is equal to the remainer of dividing them.
  964.  
  965. 100 div 3 = 33 (r1)
  966. 100 mod 3 = 1
  967.  
  968. Example:
  969.  
  970. put 100 into #n
  971. mod #n 3
  972. writeln "100 mod 3 = " #n
  973.  
  974. ──────────────
  975.  MUL
  976. ──────────────
  977.  
  978. Syntax: mul #var #val
  979.  
  980.      Multiplies the value of "#var" by "#val" and stores the result in "#var".
  981.  
  982. Example:
  983.  
  984. put 5 into #n
  985. mul #n 3254
  986. writeln "5 * 3254 = " #n
  987.  
  988. ──────────────
  989.  OR
  990. ──────────────
  991.  
  992. Syntax: or #var #val
  993.  
  994.      Bitwise or's the values of "#var" and "#val" and stores the result in
  995. "#var".
  996.  
  997. 1 or 1 = 1
  998. 1 or 0 = 1
  999. 0 or 1 = 1
  1000. 0 or 0 = 0
  1001.  
  1002. Example:
  1003.  
  1004. put 54 into #n
  1005. or #n 128
  1006. writeln "54 or 128 = " #n
  1007.  
  1008. ──────────────
  1009.  PCTBAR
  1010. ──────────────
  1011.  
  1012. Syntax: pctbar #x #y #len #sofar #tot
  1013.  
  1014.      Draws a "percent done" bar at (#x, #y) with a length of "#len".  "sofar"
  1015. represents how much of the total, "#tot", has been finished, ie: for 5 things
  1016. done out of 17, #sofar would be 5 and #tot would be 17.  It returns the
  1017. calculated percentage in #percent.  The bar is calculated like this:
  1018.  
  1019. #percent = #sofar * 100 div #tot    <- the calculated percentage
  1020. #covered = #percent * #len div 100  <- the length of the covered portion
  1021. #uncovered := #len - #covered       <- the length of the uncovered portion
  1022.  
  1023. (see COPY.CFG for an example)
  1024.  
  1025. ──────────────
  1026.  PUT
  1027. ──────────────
  1028.  
  1029. Syntax: put val into var
  1030.  
  1031.      Places the value "val" into the variable "var".  It automatically adjusts
  1032. the type of the value to the type of variable, ie: it will convert a string to
  1033. an integer value to store it in an integer variable.  "val" can be a variable
  1034. or a constant.
  1035.  
  1036. Example:
  1037.  
  1038. put "Text" into #IntVar
  1039. writeln #IntVar
  1040. ; #"Text" = 0
  1041. put "99' into #IntVar
  1042. writeln #IntVar
  1043. ; #"99" = 99
  1044. put 99 into #IntVar
  1045. writeln #IntVar
  1046. ; #99 = 99
  1047. put "Text" into $StrVar
  1048. writeln $StrVar
  1049. ; $"Text" = "Text"
  1050. put "99" into $StrVar
  1051. writeln $StrVar
  1052. ; $"99" = "99"
  1053. put 99 into $StrVar
  1054. writeln $StrVar
  1055. ; $99 = "99"
  1056.  
  1057. ──────────────
  1058.  RANDOM
  1059. ──────────────
  1060.  
  1061. Syntax: random #val #var
  1062.  
  1063.      Picks a number x, so that 0 <= x < "#val", and stores it in "#var".
  1064.  
  1065. (see #wherex for example)
  1066.  
  1067. ──────────────
  1068.  READ
  1069. ──────────────
  1070.  
  1071. Syntax: read $s
  1072.  
  1073.      Reads a line of text into the variable "$s", converting it if necessary.
  1074.  
  1075. Example:
  1076.  
  1077. write "Enter your name: "
  1078. read $s
  1079. write "Age? "
  1080. read #a
  1081. writeln
  1082. writeln "Data:"
  1083. writeln
  1084. writeln "Name: " $s
  1085. writeln "Age: " #a
  1086.  
  1087. ──────────────
  1088.  READFIELD
  1089. ──────────────
  1090.  
  1091. Syntax: readfield #x #y #len $s
  1092.  
  1093.      Reads a delimited field from the user at (#x, #y).  Fills the entry box
  1094. with the value of "$s", and then pads the rest using spaces.  It uses the
  1095. color in TextColor.  Hitting ESC while editing brings back the default.  When
  1096. the default is shown, pressing any character key will erase it.
  1097.  
  1098. Editing keys:
  1099.  
  1100.  Left: Moves cursor left one space
  1101.  Right: Moves cursor right one space
  1102.  Home: Moves cursor to start
  1103.  End: Moves cursor to end
  1104.  Delete: Deletes character at cursor
  1105.  Backspace: Removes character before cursor
  1106.  Esc: Restores last input
  1107.  
  1108.  (only if #READUPDOWN is not set to 0)
  1109.  Up: Increases the value of the field by one if it is an integer
  1110.  Down: Decreases the value of the field by one if it is an integer
  1111.  
  1112. Example:
  1113.  
  1114. clrscr
  1115. put 31 into #textcolor
  1116. clreol
  1117. center 1 "Demo Install Program"
  1118. gotoxy 1 25
  1119. clreol
  1120. center 25 "(c) 1994 by Matthew Mastracci"
  1121. put 7 into #textcolor
  1122. writechar 1 2 1840 "▒"
  1123. window 5 10 75 14 68 79 68 "" 1
  1124. gotoxy 7 12
  1125. put 79 into #textcolor
  1126. writeln "Enter something: "
  1127. put 63 into #textcolor
  1128. put " -- Default Response -- " into $s
  1129. readfield 24 12 50 $s
  1130. closewin
  1131. put 7 into #textcolor
  1132. clrscr
  1133. writeln "You typed: " $s
  1134.  
  1135. ──────────────
  1136.  READKEY
  1137. ──────────────
  1138.  
  1139. Syntax: readkey $key
  1140.  
  1141.      Reads a key from the key buffer if one is available, or else waits for
  1142. one.  If the key is a regular one, it stores just the ascii value in the
  1143. variable "$key", else it stores a space in the first character and the
  1144. extended scan code in the second.
  1145.  
  1146. Example:
  1147.  
  1148. writeln "Hit a key..."
  1149. readkey $s
  1150. length $s #n
  1151. if #n = 1 then Regular
  1152. writeln "You hit an extended key"
  1153. goto Done
  1154. :Regular
  1155. writeln "You hit a regular key"
  1156. :Done
  1157.  
  1158. ──────────────
  1159.  RETURN
  1160. ──────────────
  1161.  
  1162. Syntax: return
  1163.  
  1164.      Pops the last linenumber off the gosub stack (effectively returning to
  1165. the line after the gosub).
  1166.  
  1167. (see gosub for example)
  1168.  
  1169. ──────────────
  1170.  RWRITE/RWRITELN
  1171. ──────────────
  1172.  
  1173. Syntax: rwrite n [var1 ... [var]]
  1174.         rwriteln n [var1 ... [var]]
  1175.  
  1176.      Writes the list of variables to the screen "n" times.  Useful for drawing
  1177. a background that has a multiple-char pattern instead of a single char.  The
  1178. difference is that "rwriteln" put a carriage return after each listing.
  1179.  
  1180. Example:
  1181.  
  1182. clrscr
  1183. put 78 into #textcolor
  1184. rwrite 666 "  "
  1185. write " "
  1186. ; Finishes last bit of pattern
  1187.  
  1188. ──────────────
  1189.  SHOW
  1190. ──────────────
  1191.  
  1192. Syntax: show
  1193.  
  1194.      Swaps the display page back to the page that was building.
  1195.  
  1196. (see build for example)
  1197.  
  1198. ──────────────
  1199.  STRUPPER
  1200. ──────────────
  1201.  
  1202. Syntax: strupper $s $upper
  1203.  
  1204.      Converts the string "$s" to uppercase and stores it in "$upper".
  1205.  
  1206. write "Enter a string: "
  1207. read $s
  1208. strupper $s
  1209. writeln $s
  1210.  
  1211. ──────────────
  1212.  SUB
  1213. ──────────────
  1214.  
  1215. Syntax: sub #var #val
  1216.  
  1217.      Subtracts the value of "#val" from "#var", storing it in "#var".
  1218.  
  1219. put 15 into #n
  1220. sub #n 100
  1221. writeln "15 - 100 = " #n
  1222.  
  1223. ──────────────
  1224.  SUBSTR
  1225. ──────────────
  1226.  
  1227. Syntax: substr $s #start #len $dest
  1228.  
  1229.      Takes the substring of "$s", starting at "#start" and ending "#len"
  1230. characters later and stores it in $dest.
  1231.  
  1232. Example:
  1233.  
  1234. put "." into $curdir
  1235. fexpand $curdir
  1236. substr $curdir 1 1 $curdrive
  1237. writeln "Current drive is " $curdrive ":"
  1238.  
  1239. ──────────────
  1240.  STOP
  1241. ──────────────
  1242.  
  1243. Syntax: stop #errorlevel
  1244.  
  1245.      Halts the script, returning to DOS with an errorlevel of "#errorlevel".
  1246. The errorlevel can be tested using the "if ... then" batch command in DOS.
  1247.  
  1248. Example:
  1249.  
  1250. write "Errorlevel? "
  1251. read #err
  1252. halt #err
  1253.  
  1254. ──────────────
  1255.  STRPOS
  1256. ──────────────
  1257.  
  1258. Syntax: strpos $substr $s #pos
  1259.  
  1260.      Locates "$substr" in "$s" and places its location in "#pos".  If it isn't
  1261. found, 0 is returned.
  1262.  
  1263. Example:
  1264.  
  1265. put "ABCDEFGHIJKLMNOPQRSTUVWXYZ" into $alphabet
  1266. write "Enter a letter: "
  1267. read $s
  1268. strupper $s $s
  1269. strpos $s $alphabet #num
  1270. writeln "Letter " $s " is at position " #num " in the alphabet"
  1271.  
  1272. ──────────────
  1273.  TEXTWIN
  1274. ──────────────
  1275.  
  1276. Syntax: textwin [#x1 #y1 #x2 #y2]
  1277.  
  1278.      Defines a window for text on the screen.  To reset the coordinates, don't
  1279. pass any values.
  1280.  
  1281. Example:
  1282.  
  1283. put 31 into #textcolor
  1284. textwin 5 5 9 10
  1285. clrscr
  1286. writeln "hi hi hi hi hi hi hi hi"
  1287. put 7 into #textcolor
  1288. textwin
  1289. put 79 into #textcolor
  1290. gotoxy 35 15
  1291. writeln "Outside"
  1292.  
  1293. ──────────────
  1294.  WAIT
  1295. ──────────────
  1296.  
  1297. Syntax: wait #secs
  1298.  
  1299.      Waits "#secs" seconds and then returns.
  1300.  
  1301. (see closewin for example)
  1302.  
  1303. ──────────────
  1304.  WINDOW
  1305. ──────────────
  1306.  
  1307. Syntax: window #x1 #y1 #x2 #y2 #c1 #c2 #c3 [$title [#type]]
  1308.  
  1309.      Opens a window from (x1, y1) - (x2, y2) with the border color of "c1",
  1310. the inside color of "c2" and the title color of "c3".  The title of the window
  1311. is optional.  If the title is blank, the window will have no title.  The type
  1312. can either be 0, which explodes the window on to the screen, or 1, which
  1313. expands the window horizontally and then vertically.  To specify the type and
  1314. no window title, put "" as the title, or else the title will be your window
  1315. type.  Use closewin to close the last window opened.
  1316.  
  1317. Example:
  1318.  
  1319. window 5 5 50 10 31 31 31 "Demo Window" 1
  1320. textwin 7 6 48 9
  1321. put 31 into #textcolor
  1322. writeln "window text"
  1323. wait 5
  1324. closewin
  1325. textwin
  1326. gotoxy 10 10
  1327. put 7 into #textcolor
  1328. writeln "Non-window text"
  1329.  
  1330. ──────────────
  1331.  WRITE/WRITELN/WRITETO
  1332. ──────────────
  1333.  
  1334. Syntax: write [var1 ... [var]]
  1335.         writeln [var1 ... [var]]
  1336.         writeto var [var1 ... [var]]
  1337.  
  1338. write/writeLn:
  1339.      Displays the variables/immediate values passed to it.  Writeln goes the
  1340. beginning of the next line after printing the values.
  1341.  
  1342. writeto:
  1343.      Takes the output from the write and stores it in the variable passed
  1344. to it.  Used for concatinating strings and constructing displays.
  1345.  
  1346. Example:
  1347.  
  1348. put "456" into $s
  1349. put 789 into #n
  1350. writeln "123" $s #n " <- normal"
  1351. ; Prints "123456789"
  1352. write #n $s "123" " <- reversed"
  1353. ; Prints "789456123"
  1354. writeto $number $s "123" #n
  1355. writeln $number
  1356. ; Prints 456123789
  1357.  
  1358.  
  1359. ──────────────
  1360.  WRITECHAR
  1361. ──────────────
  1362.  
  1363. Syntax: writechar #x #y #n $character
  1364.  
  1365. Writes "#n" times, the first character of the string "$character" at
  1366. (#x, #y) in the current text color.  Useful for flashing single character
  1367. backgrounds onto the screen.
  1368.  
  1369. Example:
  1370.  
  1371. clrscr
  1372. put 31 into #textcolor
  1373. clreol
  1374. center 1 "Demo Install Program"
  1375. gotoxy 1 25
  1376. clreol
  1377. center 25 "(c) 1994 by Matthew Mastracci"
  1378. put 7 into #textcolor
  1379. writechar 1 2 1840 "▒"
  1380.  
  1381. ──────────────
  1382.  XOR
  1383. ──────────────
  1384.  
  1385. Syntax: xor #var #val
  1386.  
  1387.      Bitwise xor's the values of "#var" and "#val" and stores then in "#var".
  1388.  
  1389. put 128 into #n
  1390. xor #n 255
  1391. writeln "128 xor 255 = " #n
  1392.  
  1393. ──────────────
  1394.  6.0 Error Codes
  1395. ──────────────
  1396.  
  1397.      These are the runtime errors that can occur in the program.  If any
  1398. code pops up that isn't on this list, please contact me ASAP.
  1399.  
  1400. Code  Error
  1401.  
  1402. File errors:
  1403.  2    File not found
  1404.  3    Path not found
  1405.  4    Too many open files (increase files= in config.sys)
  1406.  5    File access denied
  1407.  15   Invalid drive number
  1408.  16   Cannot remove current directory
  1409.  
  1410. Disk faults:
  1411. 150   Disk is write-protected
  1412. 152   Drive not ready
  1413. 154   CRC error in data
  1414. 156   Disk seek error
  1415. 157   Unknown media type
  1416. 158   Sector Not Found
  1417. 159   Printer out of paper
  1418. 160   Device write fault
  1419. 161   Device read fault
  1420. 162   Hardware failure
  1421.  
  1422. Other:
  1423. 200   Division by zero
  1424. 201   Range check error
  1425. 202   Out of memory
  1426. 203    "  "    "
  1427.  
  1428. ──────────────
  1429.  7.0 CHECK: Script Syntax Checker
  1430. ──────────────
  1431.  
  1432.      The CHECK program is included with the package to make script debugging
  1433. much easier.  It analyzes the script and generates a list of errors and 
  1434. warnings (preceeded by either an E- or a W-) to help you isolate problems in 
  1435. your scripts.
  1436.  
  1437.  Usage: CHECK scriptname [> reportfile]
  1438.  
  1439.  6.1 Errors and warnings for CHECK and COMPILE
  1440.  
  1441. Here are the errors and warnings you can recieve from the CHECK and
  1442. COMPILE programs:
  1443.  
  1444. Errors: (E-)
  1445.  
  1446. Integer variable expected:
  1447.  - Means that you are trying to put an integer result into a constant.
  1448.  
  1449. Invalid test:
  1450.  - The boolean test in an if ... then statement is not one of the allowed
  1451.    ones.
  1452.  
  1453. Label not found:
  1454.  - The label used in an if ... then or goto statement couldn't be found.  Try
  1455.    checking that the label is in the format of ":label".
  1456.  
  1457. Mismatched quotes
  1458.  - This usually means that a quotation mark is missing from a string somewhere
  1459.    in the line.
  1460.  
  1461. String variable expected:
  1462.  - Means that you are trying to put a string result into a constant.
  1463.  
  1464. Unexpected end of line
  1465.  - Usually means that some non-optional parameters are missing from the end of
  1466.    the line.
  1467.  
  1468. Unknown command:
  1469.  - The command is invalid or misspelt.  Check the reference section for the
  1470.    correct spelling or command.
  1471.  
  1472. Variable expected:
  1473.  - Means that you are trying to "put" a value into a constant.
  1474.  
  1475. Value expected:
  1476.  - Most likely that a # or $ is missing from the start of a variable.
  1477.  
  1478. Warnings: (W-)
  1479.  
  1480. "INTO" expected
  1481.  - Usually means that "INTO" is either misspelt or missing from a put
  1482.    statement.  If your script doesn't work properly, check the line.
  1483.  
  1484. "THEN" expected
  1485.  - Usually means that "THEN" is either misspelt or missing from an if ... then
  1486.    statement.  If your script doesn't work properly, check the line.
  1487.  
  1488. ──────────────
  1489.  8.0 COMPILE: Script Compiler
  1490. ──────────────
  1491.  
  1492.      The COMPILE program is included with the package to convert your text
  1493. scripts to a binary form when you want to complete your installation package.
  1494. It will take the .CFG file and compile it to a .DAT file.  When a script is
  1495. compiled, there is only one difference.  When an error occurs, the error
  1496. and line number are displayed, but not the actual line data and the screen is
  1497. blanked after the user presses a key.
  1498.  
  1499. Usage: COMPILE scriptfile
  1500.  
  1501.      The errors you can recieve from the COMPILE program during the checking
  1502. are the same as the ones you recieve from the CHECK program.
  1503.  
  1504. ──────────────
  1505.  9.0 Demos
  1506. ──────────────
  1507.  
  1508.      Here is a list of the current demos that come with Installer!:
  1509.  
  1510.  SOUND.CFG  - Demonstrates how to read configuration from the user and store
  1511.               it in a data file.
  1512.  NUMBER.CFG - Number guessing game, shows how to use if ... then statements, 
  1513.               gotos and labels. 
  1514.  COPY.CFG   - Fully-fledged, copying, install program.  Shows how to parse
  1515.               directories given by the user and how to display the status
  1516.               on-screen. (uses pctbar.cfg)
  1517.  
  1518. ──────────────
  1519.  10.0 Keeping in touch
  1520. ──────────────
  1521.  
  1522.      If you find a bug anywhere in the program on in the documentation, please 
  1523. report it immediately to one of the addresses below.  Also, if you find a 
  1524. problem with one of the examples or have one that's better, send it over.  
  1525. Finally: if you have a suggestion, send it my way.
  1526.  
  1527.      I can be contacted by any of these ways:
  1528.  
  1529.      Snailmail (most stable, unless my house moves without me):
  1530.  
  1531.      264 Sandpiper Circle NW
  1532.      Calgary, Alberta, Canada
  1533.      T3K 3T9
  1534.  
  1535.       ──────
  1536.  
  1537.      Phone (also quite stable, but preferably bug reports and orders only):
  1538.  
  1539.      (403) 275-0232
  1540.       - 5pm to 9pm weekdays (local time for Calgary!)
  1541.       - 9am to 9pm weekends   "     "    "    "
  1542.  
  1543.       ──────
  1544.  
  1545.      Internet (not sure if it'll be up for much longer, but worth a try if it's
  1546.                the most convenient):
  1547.  
  1548.      rayban@cambo.cpubbs.cuug.ab.ca
  1549.  
  1550.       ──────
  1551.  
  1552.      Fidonet (pretty stable):
  1553.  
  1554.      1:134/40 @ Matthew Mastracci
  1555.  
  1556.       ──────
  1557.  
  1558.      Metronet (a little more stable):
  1559.  
  1560.      201:5500/905 @ Matthew Mastracci
  1561.  
  1562.